<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>深入理解Java线程池</title>
    <link href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <link href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
            min-height: 100vh;
        }
        
        .hero-gradient {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        }
        
        .content-card {
            background: rgba(255, 255, 255, 0.95);
            backdrop-filter: blur(10px);
            transition: all 0.3s ease;
        }
        
        .content-card:hover {
            transform: translateY(-2px);
            box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
        }
        
        .section-title {
            position: relative;
            padding-left: 20px;
        }
        
        .section-title::before {
            content: '';
            position: absolute;
            left: 0;
            top: 50%;
            transform: translateY(-50%);
            width: 4px;
            height: 24px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            border-radius: 2px;
        }
        
        .code-block {
            background: #1e1e1e;
            color: #d4d4d4;
            border-radius: 8px;
            overflow-x: auto;
        }
        
        .highlight-box {
            background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
            color: white;
            padding: 20px;
            border-radius: 12px;
            margin: 20px 0;
        }
        
        .feature-card {
            background: white;
            border-radius: 12px;
            padding: 24px;
            box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
            transition: all 0.3s ease;
        }
        
        .feature-card:hover {
            transform: translateY(-4px);
            box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);
        }
        
        .mermaid {
            text-align: center;
            margin: 30px 0;
        }
        
        .drop-cap {
            float: left;
            font-size: 4em;
            line-height: 0.8;
            margin: 0.1em 0.1em 0.1em 0;
            font-weight: 700;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
        }
        
        .info-badge {
            display: inline-flex;
            align-items: center;
            padding: 4px 12px;
            background: #f3f4f6;
            border-radius: 20px;
            font-size: 0.875rem;
            margin: 0 4px;
        }
        
        .gradient-text {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
        }
    </style>
</head>
<body>
    <!-- Hero Section -->
    <div class="hero-gradient text-white py-20">
        <div class="container mx-auto px-6 text-center">
            <h1 class="text-5xl font-bold mb-6">深入理解Java线程池</h1>
            <p class="text-xl mb-8 opacity-90">掌握高并发编程的核心技术，优化系统性能的关键所在</p>
            <div class="flex justify-center space-x-4">
                <span class="info-badge bg-white bg-opacity-20 text-white">
                    <i class="fas fa-clock mr-2"></i>阅读时间：15分钟
                </span>
                <span class="info-badge bg-white bg-opacity-20 text-white">
                    <i class="fas fa-layer-group mr-2"></i>进阶内容
                </span>
            </div>
        </div>
    </div>

    <!-- Main Content -->
    <div class="container mx-auto px-6 py-12">
        <!-- Introduction -->
        <div class="content-card rounded-xl shadow-xl p-8 mb-8">
            <h2 class="section-title text-3xl font-bold mb-6">为什么要使用线程池？</h2>
            <p class="text-lg leading-relaxed mb-4">
                <span class="drop-cap">线</span>程是一个稀缺资源，每创建一个线程都需要消耗系统的资源，如果不对创建线程做控制，系统的资源就会被耗尽，最终导致服务器卡顿或宕机。所以要对线程的创建做一个控制，达到一定的数量后就不能再创建了。线程池就是为了解决这个问题而诞生的。
            </p>
            <p class="text-lg leading-relaxed">
                在线程池中维护一个稳定的线程数量，有任务需要执行就到线程池中申请一个线程去执行，可以达到资源的控制。线程池做的工作主要是控制运行的线程的数量，处理过程中将任务放入队列，然后在线程创建后启动这些任务。如果线程的数量超过最大数量，超过数量的线程将排队等候，等其他线程执行完毕，再从队列中取出任务来执行。
            </p>
        </div>

        <!-- Benefits -->
        <div class="grid md:grid-cols-3 gap-6 mb-12">
            <div class="feature-card">
                <div class="text-purple-600 text-3xl mb-4">
                    <i class="fas fa-battery-full"></i>
                </div>
                <h3 class="text-xl font-bold mb-2">降低资源消耗</h3>
                <p class="text-gray-600">通过重复利用已创建的线程降低线程创建和销毁造成的消耗。</p>
            </div>
            <div class="feature-card">
                <div class="text-purple-600 text-3xl mb-4">
                    <i class="fas fa-rocket"></i>
                </div>
                <h3 class="text-xl font-bold mb-2">提高响应速度</h3>
                <p class="text-gray-600">当任务到达时，可以不需要等待线程创建就能立即执行。</p>
            </div>
            <div class="feature-card">
                <div class="text-purple-600 text-3xl mb-4">
                    <i class="fas fa-cogs"></i>
                </div>
                <h3 class="text-xl font-bold mb-2">提高线程的可管理性</h3>
                <p class="text-gray-600">使用线程池可以进行统一的分配、监控和调优，保证系统的稳定运行。</p>
            </div>
        </div>

        <!-- Basic Usage -->
        <div class="content-card rounded-xl shadow-xl p-8 mb-8">
            <h2 class="section-title text-3xl font-bold mb-6">线程池基本使用</h2>
            <pre class="code-block p-6 overflow-x-auto"><code class="language-java">// 获取当前机器的核数    
private static Integer code = Runtime.getRuntime().availableProcessors();

static {
    threadPoolExecutor = new ThreadPoolExecutor(
        code,                      // 核心线程数
        code * 2,                  // 最大线程数量
        3,                         // 空闲线程时间
        TimeUnit.SECONDS,          // 时间单位
        new LinkedBlockingQueue<>(500),  // 队列
        Executors.defaultThreadFactory(), // 线程创建工厂
        new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
    );
}</code></pre>
        </div>

        <!-- Core Parameters -->
        <div class="content-card rounded-xl shadow-xl p-8 mb-8">
            <h2 class="section-title text-3xl font-bold mb-6">线程池7大核心参数</h2>
            
            <div class="mermaid">
                graph TD
                    A[ThreadPoolExecutor] --> B[corePoolSize<br/>核心线程数]
                    A --> C[maximumPoolSize<br/>最大线程数]
                    A --> D[keepAliveTime<br/>存活时间]
                    A --> E[TimeUnit<br/>时间单位]
                    A --> F[workQueue<br/>工作队列]
                    A --> G[threadFactory<br/>线程工厂]
                    A --> H[handler<br/>拒绝策略]
                    
                    style A fill:#667eea,stroke:#764ba2,stroke-width:3px,color:#fff
                    style B fill:#f093fb,stroke:#f5576c,stroke-width:2px,color:#fff
                    style C fill:#f093fb,stroke:#f5576c,stroke-width:2px,color:#fff
                    style D fill:#f093fb,stroke:#f5576c,stroke-width:2px,color:#fff
                    style E fill:#f093fb,stroke:#f5576c,stroke-width:2px,color:#fff
                    style F fill:#f093fb,stroke:#f5576c,stroke-width:2px,color:#fff
                    style G fill:#f093fb,stroke:#f5576c,stroke-width:2px,color:#fff
                    style H fill:#f093fb,stroke:#f5576c,stroke-width:2px,color:#fff
            </div>

            <div class="grid md:grid-cols-2 gap-6 mt-8">
                <div class="bg-gray-50 p-6 rounded-lg">
                    <h4 class="font-bold text-lg mb-3 gradient-text">corePoolSize</h4>
                    <p>线程池核心线程数量，核心线程不会被回收，即使没有任务执行，也会保持空闲状态。</p>
                </div>
                <div class="bg-gray-50 p-6 rounded-lg">
                    <h4 class="font-bold text-lg mb-3 gradient-text">maximumPoolSize</h4>
                    <p>池允许最大的线程数，当线程数量达到corePoolSize，且workQueue队列塞满任务了之后，继续创建线程。</p>
                </div>
                <div class="bg-gray-50 p-6 rounded-lg">
                    <h4 class="font-bold text-lg mb-3 gradient-text">keepAliveTime</h4>
                    <p>超过corePoolSize之后的"临时线程"的存活时间。</p>
                </div>
                <div class="bg-gray-50 p-6 rounded-lg">
                    <h4 class="font-bold text-lg mb-3 gradient-text">workQueue</h4>
                    <p>当前线程数超过corePoolSize时，新的任务会处在等待状态，并存在workQueue中。</p>
                </div>
            </div>
        </div>

        <!-- Rejection Policies -->
        <div class="highlight-box">
            <h3 class="text-2xl font-bold mb-4">
                <i class="fas fa-exclamation-triangle mr-2"></i>拒绝策略
            </h3>
            <div class="grid md:grid-cols-2 gap-4">
                <div class="bg-white bg-opacity-20 p-4 rounded-lg">
                    <h4 class="font-bold mb-2">AbortPolicy</h4>
                    <p class="text-sm">默认策略，直接抛异常处理</p>
                </div>
                <div class="bg-white bg-opacity-20 p-4 rounded-lg">
                    <h4 class="font-bold mb-2">DiscardPolicy</h4>
                    <p class="text-sm">直接抛弃不处理</p>
                </div>
                <div class="bg-white bg-opacity-20 p-4 rounded-lg">
                    <h4 class="font-bold mb-2">DiscardOldestPolicy</h4>
                    <p class="text-sm">丢弃队列中最老的任务</p>
                </div>
                <div class="bg-white bg-opacity-20 p-4 rounded-lg">
                    <h4 class="font-bold mb-2">CallerRunsPolicy</h4>
                    <p class="text-sm">将任务分配给当前调用线程处理</p>
                </div>
            </div>
        </div>

        <!-- Work Queue Types -->
        <div class="content-card rounded-xl shadow-xl p-8 mb-8 mt-8">
            <h2 class="section-title text-3xl font-bold mb-6">线程池工作队列</h2>
            
            <div class="space-y-6">
                <div class="border-l-4 border-purple-600 pl-6">
                    <h4 class="text-xl font-bold mb-2">ArrayBlockingQueue</h4>
                    <p class="text-gray-700">基于数组结构的有界阻塞队列，按FIFO原则对元素进行排序。生产者和消费者共用同一个锁对象，无法真正并行运行。</p>
                </div>
                
                <div class="border-l-4 border-purple-600 pl-6">
                    <h4 class="text-xl font-bold mb-2">LinkedBlockingQueue